<?php

class OrdenController extends Controller {

    function __construct() {
        parent::__construct();
        $this->loggin_type = 'loginuser';
    }

    function index() {
        $this->redirect_to('orden', 'nueva_orden');
    }

    function nueva_orden() {
        $afiliado = Session::get_object('user');
        $orden = new Orden();
        $orden->set_afiliado($afiliado);
        Session::set_object('orden', $orden);
        // Si pasa los controles, entonces se renderiza el formulario para cargar datos de la nueva orden
        if ($this->controles($afiliado)):
            $this->set('plus', PlusOrden::find('all', array('order' => 'nombre')));
            $this->set('profesionales', Profesional::find('all', array('order' => 'nombre')));

            $this->render();
        else:
            $this->render('display_errors');
        endif;
    }

    function mostrar_orden() {
        $this->add_css_tags(VIEW_PATH . 'layout' . DS . 'default'
                . DS . 'css' . DS . 'printable.css', array('media' => 'print'));
        $orden = Session::get_object('orden');

        /* Setting Plus */
        $plus = PlusOrden::find_by_id($_POST['plus_id']);
        $orden->_plus = $plus;
        /**
         * Setting Profesional
         * Si no se cargó el profesional en el formulario entonces es guardia sanatorial 
         * o un profesional fuera de la ciudad.
         * Por lo tanto, no se conoce el profesional que atenderá al afiliado, por esta razón,
         * se carga un profesional genérico.
         * */
        if ($_POST["profesional"]):
            $id_profesional = $_POST["profesional"];
        elseif ($plus->id == 2):
            $id_profesional = PROFESIONAL_GENERICO_GUARDIA;
        elseif ($plus->id == 5):
            $id_profesional = PROFESIONAL_NO_DEFINIDO;
        endif;
        $profesional = Profesional::find_by_idprofesional($id_profesional);

        $orden->set_solicitante($profesional);

        /**
         * Setting Prestacion
         * Por el momento, la prestación se carga en función del plus elegido.
         * */
        $prestacion = $this->get_prestacion($profesional, $_POST['plus_id']);   //PrestacionMedica::find_by_idprestacionmedica($_POST["prestacion"]);

        $orden->set_prestacion($prestacion);
        Session::set_object('orden', $orden);

        /* Calcular la fecha de validez de la orden. */
        $fecha_actual = date_create()->format("d/m/Y");
        $cant_dias = GeneralConfig::find_by_nombre("periodo_validez_orden")->valor();
        $fecha_limite = date("d/m/Y", strtotime("+ $cant_dias days"));
        $this->set('fecha_actual', $fecha_actual);
        $this->set('fecha_limite', $fecha_limite);

        if($_POST["recetario"] == "true"):
            $this->set('incluir_recetario', true);
        else:
            $this->set('incluir_recetario', false);
        endif;
            
        /* Reimpresion */
        if (Session::get('orden_impresa') >= 1)
            $this->set('duplicada', true);
        
        $this->render();
    }

    function get_profesionales() {
        if ($_POST["term"]):
            $profesionales = Profesional::find_by_sql("
            SELECT profesionales.* 
                FROM profesionales
                WHERE   nombre LIKE '%{$_POST["term"]}%'
                ORDER BY nombre");
            echo $this->array_json($profesionales, array('only' => array('nombre', 'idprofesional')));
        endif;
    }

    function save() {
        $orden = Session::get_object('orden');
        $orden->save();
        $this->save_recetario();
        echo $orden->mask_codigo();
        Session::set_object('orden', $orden);
        Session::set('orden_impresa', 1);       
    }

    private function controles($afiliado) {
        $excede_limite_mensual = $afiliado->excede_limite_mensual_ordenes();
        $excede_cuenta_corriente = $afiliado->excede_cuenta_corriente();
        if ($excede_limite_mensual || $excede_cuenta_corriente):
            if ($excede_limite_mensual):
                $this->set_message('Exceso limite mensual', MSJ_LIMITE_MENSUAL);
            endif;
            if ($excede_cuenta_corriente):
                $this->set_message('Deuda en Cuenta Corriente', MSJ_DEUDA_CTA_CTE);
            endif;
            return false;
        endif;
        return true;
    }

    private function get_prestacion($profesional, $plus_id) {

        $p_420103 = PrestacionMedica::find('420103');
        $consulta_general = PrestacionMedica::get_consulta_general($profesional->_especialidad);

        // Este array relaciona el plus (key) con una prestacion (value)
        $plus_prestaciones = array(
            '3' => $consulta_general,
            '2' => $p_420103,
            '4' => $p_420103,
            '5' => $consulta_general,
            '1' => PrestacionMedica::find('420201')
        );

        return $plus_prestaciones[$plus_id];
    }

    function finalizacion() {
        $this->render();
    }

    function reimpresion() {
        $cant = Session::get('orden_impresa') + 1;
        Session::set('orden_impresa', $cant);
    }

    function validar_datos() {
        if ($_POST["prof"]) {
            $profesional = Profesional::find($_POST["prof"]);
            $especialidad = $profesional->_especialidad;
            $plan_afiliado = Session::get_object('user')->_grupo->_plan;

            // Se verifica si el el profesional atiende el plan del afiliado
            $profesional_atiende_plan = ProfPlan::find(array(
                        'profesional' => $profesional->idprofesional,
                        'plan' => $plan_afiliado->idplan
            ));

            if (!$especialidad->web_uso):
                echo "La especialidad {$especialidad->descripcion} no está habilitada para su uso web. Favor de dirigirse a nuestras oficinas";
            elseif (!$profesional_atiende_plan):
                echo "El profesional seleccionado no atiende el plan {$plan_afiliado->siglas}. Favor de dirigirse a nuestras oficinas";
            endif;
        }
    }

    public function nuevo_recetario() {
        $ref = VIEW_PATH . 'layout'. DS . 'default' . DS . 'css' . DS . 'printable.css';
        $this->add_css_tags($ref, array('media' => 'print'));
        $this->render('recetario/recetario');
    }
    
    /* 
     *  Este método se usa para guardar el recetario cuando sólo se elige la     
        opción de imprimir recetario y también se usa cuando se saca una orden con  
        recetario 
     */
    public function save_recetario(){
        $recetario = new Recetario();
        $recetario->_afiliado = Session::get_object('user');
        $recetario->save();
    }

}

?>
